package com.jacob.androidstudy.javanote;

import java.io.*;
import java.net.ConnectException;

/**
 * Java异常
 * 1. Throwable是所有异常的父类。下面有Error和Exception两个子类。
 * 2. Exception下又分为RuntimeException和非RuntimeException两种。
 * 3. Error和RuntimeException统称为未检查异常（UncheckedException）。
 * 4. 非RuntimeException称为已检查异常（CheckedException）。
 */
/**
 * Error
 * 用来描述Java运行时系统的内部错误和资源耗尽错误。
 * 出现Error时，除了尽量让程序安全终止外，再也无能为力了。
 * 
 */
/**
 * UncheckedException（RuntimeException+Error）
 * 1. 这类异常都是由于程序员粗心大意造成的，是可以避免的。
 * 2. 要求程序员处理自己的粗心大意是矛盾的，所以这类异常不需要处理。
 * 3. 数组下标越界、空指针异常、算术异常（整型除零）、数组大小为负、类型转换异常
 */
/**
 * CheckedException（非RuntimeException）
 * 1. 这类异常一般是由于外部原因造成的。
 * 2. 编译器要求程序员要对这种异常做预见性的处理。
 * 3. 
 */
public class $15_异常 {

	public static void main(String[] args) throws FileNotFoundException, ConnectException {
		
		/**
		 * 抛出异常有2个途径
		 * 1. 调用可能抛出异常的代码。
		 * 2. throw一个异常对象。
		 * 3. 若抛出的异常是RuntimeException或其子类，则不需要进行catch，也不需要throws。
		 * 4. 若抛出的异常是非RuntimeException或其子类，则必须catch或在方法头处throws。
		 */
		FileInputStream fis = new FileInputStream(new File("D:\readme.txt")); //调用的new FileInputStream()本身可能抛出FileNotFoundException。又因为FileNotFoundException是非RuntimeException，则此异常必须catch或者在方法头处throws。
/*		throw new ConnectException(); //手工抛出异常也很简单。只要找到一个适合的异常类，并throw这个类的对象即可。此处throw的是非RuntimeException，所以此异常必须catch或者在方法头处throws。
		throw new RuntimeException(); //手工抛出异常也很简单。只要找到一个适合的异常类，并throw这个类的对象即可。此处throw的是RuntimeException，所以不需要进行任何处理。
		
		
		try {
//			这里写可能抛出异常的代码
//			一旦某行代码抛出异常，try中其后的代码就不执行了。
//			try里若有return的话，则catch中也必须有return。
		} catch (NullPointerException e) {
//			这里写异常处理代码
//			若try中抛出的异常类型为catch参数中的类型/子类，就执行这里的代码。
		} catch (RuntimeException e) {
//			若抛出的异常没有被任何catch捕获，则执行完finally块后，程序退出。
		} finally {
//			finally和catch最少要有一种。
//			无论是否抛出异常，无论异常是否被捕获，一定会执行的代码。除非在前面执行了System.exit(0)。
//			若这里写了return语句，会覆盖try和catch里的return语句。
		}*/
		
		
	}

}
